package daos

import (
	"Bok/models"
	"errors"
	"fmt"
	"time"

	"gorm.io/gorm"
)

type UserDao interface {
	RegisterDao(user *models.RegistryRequest) error
	LoginDao(username string) (*models.User, error)
	GetUserById(userId uint) (*models.User, error)
	UpdateUser(userId uint, updateData map[string]interface{}) error
}

type userDao struct {
	db *gorm.DB
}

func NewUserDao(db *gorm.DB) UserDao {
	return &userDao{db: db}
}

func (dao *userDao) RegisterDao(user *models.RegistryRequest) error {
	err := dao.db.Table("users").Create(&user).Error
	if err != nil {
		return err
	}
	return nil
}

func (dao *userDao) LoginDao(username string) (*models.User, error) {
	var result *models.User
	// 在数据库中查找 这么一条数据
	err := dao.db.Table("users").
		Where("username=?", username).
		First(&result).Error
	if err != nil {
		// 说明查找失败\
		fmt.Println("查找失败~~", err)
		return nil, err
	}
	return result, nil
}

func (dao *userDao) GetUserById(userId uint) (v *models.User, err error) {
	var result models.User
	err = dao.db.Table("users").Where("Id=?", userId).First(&result).Error
	if err != nil {
		fmt.Println("dao:查找失败")
		return nil, err
	}
	fmt.Println("dao:OK")
	return &result, nil
}

func (dao *userDao) UpdateUser(userId uint, updateData map[string]interface{}) (err error) {
	updateData["updated_at"] = time.Now()

	// 执行更新：WHERE条件为用户ID，只更新map中的字段
	result := dao.db.Model(&models.User{}). // 关联表（可传空结构体指定表）
						Where("id = ?", userId).
						Updates(updateData) // 使用map更新部分字段

	if result.Error != nil {
		return result.Error
	}
	if result.RowsAffected == 0 {
		return errors.New("用户不存在或未修改内容")
	}
	fmt.Println("dao结果:", result)
	return nil
}
